package string;

import java.util.HashSet;
import java.util.Set;

/**
 * 给你一个二进制字符串 s 和一个整数 k 。如果所有长度为 k 的二进制字符串都是 s 的子串，请返回 true ，否则请返回 false 。
 * <p>
 * 示例 1：
 * 输入：s = "00110110", k = 2
 * 输出：true
 * 解释：长度为 2 的二进制串包括 "00"，"01"，"10" 和 "11"。它们分别是 s 中下标为 0，1，3，2 开始的长度为 2 的子串。
 * <p>
 * 示例 2：
 * 输入：s = "0110", k = 1
 * 输出：true
 * 解释：长度为 1 的二进制串包括 "0" 和 "1"，显然它们都是 s 的子串。
 * <p>
 * 示例 3：
 * 输入：s = "0110", k = 2
 * 输出：false
 * 解释：长度为 2 的二进制串 "00" 没有出现在 s 中。
 *
 * @author Jisheng Huang
 * @version 20250507
 */
public class HasAllCode_1461 {

    public static boolean hasAllCodes(String s, int k) {
        if (s.length() < (1 << k) + k - 1) {
            return false;
        }

        Set<String> set = new HashSet<>();

        for (int i = 0; i + k <= s.length(); ++i) {
            set.add(s.substring(i, i + k));
        }

        return set.size() == (1 << k);
    }

    public static void main(String[] args) {
        String s = "00110110";
        int k = 2;

        System.out.println(hasAllCodes(s, k));

        s = "0110";
        k = 1;

        System.out.println(hasAllCodes(s, k));

        s = "0110";
        k = 2;

        System.out.println(hasAllCodes(s, k));
    }
}
